/*
	Arquivo contendo todas funcoes utilizadas para o laboratorio de arvore B.
	Desricao das funcoes no arquivo de cabecalho func.h.
*/
#include "func.h"

FILE *Fopen(char *fname, char *mode)
{
	FILE *f = fopen(fname, mode);
	
	if(f == NULL)
	{
		perror("ERRO");
		exit(1);
	}
	else
		return f;
}

int index_new(char *info, char *iname, int tamreg, int begin, int keysize)
{
	int qtdreglidos = 0;        /* quantidade de registros lidos do arquivo de dados */
	int j = 0;                  /* contador auxiliar */
	long int qtdreg, tam;       /* quantidade de registros calculados, tamanho doa rquivo*/
	long int pos;               /* auxiliar para guardar a posicao no arquivo */
	
	FILE *f = Fopen(info, "r");
	FILE *i = Fopen(iname, "w");
	
	fseek(f, 0, SEEK_END);      /* calculo da quantidade de registros */
	tam = ftell(f);
	qtdreg = tam/tamreg;
	fseek(f, 0, SEEK_SET);
	
	char *chave = (char*)malloc(sizeof(char)*(keysize+1));
	char *registro = (char*)malloc(sizeof(char)*(tamreg+1));
	
	while(j < qtdreg)
	{
		pos = ftell(f)/tamreg;                      /* calculo do RRN do registro atual */
		
		fgets(registro, tamreg+1, f);               /* leitura do registro atual */
		strncpy(chave, &registro[begin], keysize);  /* copia da chave do registro */
		
		chave[keysize] = 0;
		
		fprintf(i, "%s %ld\n", chave, pos);         /*impressao no arquivo de indice da chave e do RRN*/
		
		fflush(i);
		qtdreglidos++;
		j++;
	}
	
	fclose(f);
	fclose(i);
	
	
	free(chave);
	free(registro);
	
	return qtdreglidos;                               /*retorna a quantidade de registros lidos com sucesso*/
}

// void le_indice(FILE *f, char *chave, int *pos)
// {
// 	if(f != NULL && !feof(f))
// 		fscanf(f, "%s %d\n", chave, pos);
// }
//

ppage read_page(FILE *f, ppage memo, int nchaves)
{
	if( !feof(f) )
	{
		int i;      /* 
		
		fscanf(f, "%d", memo->qtd);

		// CHAVES
	// 	le as chaves
		for(i = 0; i < qtd; i++)
			fscanf(f, "%d", memo->chaves[i]);
	// 	completa com valores nulos
		for(; i < nchaves; i++)
			memo->chaves[i] = -1;

		// FILHOS
	// 	le os enderecos dos filhos
		for(i = 0; i < qtd; i++)
			fscanf(f, "%d", memo->filhos[i]);
	// 	completa com valores "nulos"
		for(; i < nchaves; i++)
			memo->filhos[i] = -1;
	}
	
	return memo;
}


void insert(int rrn, int *key, int *promo_r_child, int *promo_key)
{
	page pagina,                /*pagina atual*/
	     new_page;              /*pagina criada se houver promocao*/
	
	int found, promoted;

	int rrn,
	    rrn_p,                  /*rrn da cahve promovida*/
	    rrn_p_key;              /*chave promovida*/
	
	if (rrn == NIL)
	{
		promo_key = key;
		promo_r_child = NIL;
		
		return TRUE;
	}
	
}


int read_ram(char* file_name, page* pagina, int tamreg)
{
	FILE *ap_file;
	int i = 0;
	
	ap_file = fopen (file_name, "a");         /*Abre o arquivo para insercao na ultima linha*/
	
	fprintf (ap_file, "%d ", pagina->qtd);    /*Insere a quantidade de chaves ocupadas*/
	
	for (i = 0; i < ORDEM-1; i++)             /*Insercao da chave no arquivo*/
	{
		if (pagina->chaves[i]==NIL)
			fprintf (ap_file, "###### ", pagina->chaves[i]);   /*Insere valor nulo ######*/
		else
			fprintf (ap_file, "%0.6d ", pagina->chaves[i]);
	}
	
	for (i = 0; i < ORDEM-1; i++)              /*Insercao do RRN dos filhos*/
	{
		if (pagina->filhos[i]==NIL)
			fprintf (ap_file, "-1 ", pagina->filhos[i]);      /*Valor nulo, -1*/
		else
			fprintf (ap_file, "%0.2d ", pagina->filhos[i]);
	}
	
	if (pagina->filhos[ORDEM-1] == NIL)                          /*Insercao do ultimo filho, separada por causa do \n*/
		fprintf (ap_file, "-1\n", pagina->filhos[ORDEM-1]);
	else
		fprintf (ap_file, "%0.2d\n", pagina->filhos[ORDEM-1]);
	
	fflush(ap_file);
	
	fseek (ap_file, 0, SEEK_END);
	
	return ftell(ap_file)/tamreg;             /*Retorna o RRN para o registro inserido*/
}



